/***********************************************************************************
 * 文件名： soft_capture_config.h
 * 版本： 3
 * 说明：
 * 		利用IO中断和定时器，软件模拟硬件捕获输入组件。
 * 		可用于外部电平变化时间的检测。
 *      关键函数为 SoftCT_EvIOInt 函数，确保最高优先级响应，不被其他中断打断。
 *      在文件 soft_capture_config.h 进行正确的配置。
 * 修改记录：
 * 	2022/02/10: 初版。 黄均铭。
 *  2022/03/07：添加定时器查询模式
***********************************************************************************/
#ifndef _SOFT_CAPTURE_CONFIG_H_
#define _SOFT_CAPTURE_CONFIG_H_

#include "board.h"
// 启动外部事件通知功能，启动之后必须实现事件通知函数 SoftCT_Event(softct_event_t e)
//#define _SOFTCT_USE_EVENT_NOTIFICATION

/* 
启动定时器查询功能。
    启动之后不需要调用 SoftCT_EvTimeout （可不开启定时器中断），调用函数 SoftCT_GetEvent() 
查询并获取捕获结果，此时SoftCT_GetEvent函数为同步函数。 如果不调用 SoftCT_GetEvent 将不能
获取超时事件。
 */
// #define _SOFTCT_USE_TIMER_QUERY

//==============================================================================
// 计时变量位数设置
//      8 、16 或者 32
//      用于记录定时器的数值，一般情况下设置为定时器位数
//==============================================================================
#define _SOFTCT_TIME_BITS            8

// 中断执行消耗值，获取的数值会自动减去这个设定值，若果不需要精确获取时间，建议设置为0.
#define _SOFTCT_INT_CONSUMPTION      0

//==============================================================================
// 防止程序复位API
//==============================================================================
#ifdef _SOFTCT_USE_TIMER_QUERY
// 开启查询功能，SoftCT_GetEvent需要同步等待结果，如果时间过长，需要定时清除看门狗
#define _SoftCT_ClrWdt()            Wdt_Clear()
#endif

//==============================================================================
// 中断 操作API定义
//==============================================================================
// SoftCT_Run() 函数中开始计时前执行，确保IO中断和定时器中断为最高优先级(IO中断优先级高于等于定时器中断)
#define _SoftCT_EnterCritical()

// 停止捕获后调用，还原IO中断和定时器中断优先级
#define _SoftCT_ExitCritical()

//==============================================================================
// 定时器 操作API定义
//==============================================================================
// 初始化定时器
#define _SoftCT_TimInit()           Tim1_Init()		    
// 开启定时器
#define _SoftCT_TimRun()            Tim1_Run()
// 停止定时器
#define _SoftCT_TimStop()           Tim1_Stop()
// 清除定时器计数
#define _SoftCT_TimClrCount()       Tim1_SetValue(0XFF)
// 获取定时器计数
#define _SoftCT_TimGetCount()       (0XFF-Tim1_GetValue())
// 清除定时器溢出标记
#define _SoftCT_TimClrOvfFlag()        Tim1_ClrIntFlag()
// 获取定时器溢出标记
#define _SoftCT_TimGetOvfFlag()        Tim1_GetIntFlag()

#endif
